package com.jerei.store.service.impl;

import com.jerei.store.entity.Address;
import com.jerei.store.entity.User;
import com.jerei.store.mapper.UserMapper;
import com.jerei.store.service.IUserService;
import com.jerei.store.service.ex.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.UUID;

@Service
public class UserServiceImpl implements IUserService{
    @Autowired
    private UserMapper userMapper;
    @Override
    public void register(User user) {
        //输出日志
        System.out.println("UserServiceImpl.register()");
        System.out.println("注册的数据是"+user);
        //从参数中获取用户名
        String username=user.getUsername();
        //调用findByUsername方法执行查询操作
        User u=userMapper.findByUsername(username);
        //判断查询结果中返回的User是否不为null
        if(u!=null){
            //不是null，表示用户名被占用，，抛出“用户名已被占用”异常
            throw new UsernameDuplicationException("注册失败，您注册的用户名"+username+"已经被占用");
        }

        //是null，准备执行注册操作
        String salt= UUID.randomUUID().toString();
        user.setSalt(salt);
        //首先执行密码加密操作
        String md5Password=getMd5Password(salt,user.getPassword());
        user.setPassword(md5Password);
        //补全其他注册数据：isDelete为0，四项记录日志的数据
        user.setIsDelete(0);
        user.setCreatedUser(username);
        Date now=new Date();
        user.setCreatedTime(now);
        user.setModifiedUser(username);
        user.setModifiedTime(now);
        //调用insert方法执行注册，并获取返回的受影响行数
        Integer rows=userMapper.insert(user);
        //判断受影响行数的值是否不为1
        if(rows!=1){
            throw new InsertException("注册失败！发生未知错误，请联系管理员！");
        }
        //不是1，则抛出InsertException
    }

    @Override
    public User login(String username, String password) {
        //输出日志
        System.out.println("UserServiceImpl.login()");
        System.out.println("username="+username);
        System.out.println("password="+password);
        //根据用户名调用findByUsername查询
        User user=userMapper.findByUsername(username);
        //判断查询结果是否为null
        if(user==null){
            //是：抛出UserNotFindException
            throw new UserNotFoundException("登陆失败！用户名不存在");
        }
        //判断查询结构中得到isDelete是否为1
        if(user.getIsDelete()==1){
            //是：则抛出UserNotFindException
            throw new UserNotFoundException("登陆失败！用户名不存在");
        }
        //从查询结果中取出盐值
        String salt=user.getSalt();
        //基于参数password与取出的盐值执行加密得到密文
        String pwd=getMd5Password(salt,password);
        //判断以上密文与查询结果中的密文是否不一致
        if(!pwd.equals(user.getPassword())){
            //不一致，则抛出passwordNotMatvhException
            throw new PasswordNotMatchException("登陆失败！密码错误");
        }
        //创建新的User对象
        User u=new User();
        //将查询结果中的uid、username、avatar封装到新创建的User中
        u.setUsername(username);
        u.setUid(user.getUid());
        u.setAvatar(user.getAvatar());
        //返回新创建的User对象
        return u;
    }

    @Override
    public void updatePasswordByUid(String oldPassword, String newPassword, HttpSession session) {
        //输出日志
        System.out.println("UserServiceImpl.updatePasswordByUid()");
        System.out.println("\toldPassword="+oldPassword);
        System.out.println("\tnewPassword="+newPassword);

        Integer uid=(Integer) session.getAttribute("uid");
        //基于username调用findByUsername（）查询用户数据
        User u=userMapper.findByUsername((String) session.getAttribute("username"));
        //判断查询结果是否为null
        if(u==null){
            //是：抛出UserNotFoundException
            throw new UserNotFoundException("修改密码失败，用户数据不存在！");
        }
        //判断用户状态isDelete是否为1
        if(u.getIsDelete()==1){
            //是，则抛出UserNotFoundException
            throw new UserNotFoundException("修改密码失败，用户数据不存在！");
        }
        //从查询结果中取出盐值
        //对参数oldPassword执行加密得到密文
        String oldMd5=getMd5Password(u.getSalt(),oldPassword);
        //判断加密后的密文和查询结果中的密文是否一致
        if(!oldMd5.equals(u.getPassword())){
        //不一致：则抛出PasswordNotMatchException
            throw new PasswordNotMatchException("修改失败！原密码错误");
        }
        //将newPassword执行加密操作
        String newMd5=getMd5Password(u.getSalt(),newPassword);
        //调用持久层的updatePasswordByUid()并得到返回的受影响行数
        Integer rows=userMapper.updatePasswordByUid(uid,newMd5,(String) session.getAttribute("username"),new Date());
        //判断受影响行数是否不为1
        if(rows!=1){
        //是，则抛出UpdateException
            throw new UpdateException("修改失败！发生未知错误，请联系管理员");
        }
    }


    @Override
    public User showUserInfo(Integer uid) {
        //输出日志
        System.out.println("UserServiceImpl.foundUser()");
        System.out.println("\tuid="+uid);
        User u=userMapper.findByUid(uid);
        if(u==null){
            throw new UserNotFoundException("查询信息失败，用户数据不存在！");
        }
        if(u.getIsDelete()==1){
            throw new UserNotFoundException("查询信息失败，用户数据不存在！");
        }

        return u;
    }

    @Override
    public void changeUserInfo(Integer uid,String username,User user) {
        //输出日志
        System.out.println("UserServiceImpl.updateUser()");
        System.out.println("\tuser="+user);

        User u=userMapper.findByUid(uid);
        System.err.println(u);
        if(u==null){
            throw new UserNotFoundException("修改信息失败，用户数据不存在！");
        }
        if(u.getIsDelete()==1){
            throw new UserNotFoundException("修改信息失败，用户数据不存在！");
        }
        user.setUid(uid);
        user.setModifiedUser(username);
        user.setModifiedTime(new Date());
        Integer rows=userMapper.updateUserInfoByUid(user);
        if(rows!=1){
            throw new UpdateException("修改个人信息失败");
        }


    }

    @Override
    public void changeAvatar(Integer uid, String avatar, String username) {
        //基于参数uid调用findByUid()查询用户数据
        User u=userMapper.findByUid(uid);
        //判断查询结果是否为null
        if(u==null){
            throw new UserNotFoundException("修改头像失败！用户数据不存在");
        }
        if(u.getIsDelete()==1){
            throw new UserNotFoundException("修改头像失败！用户数据不存在");
        }
        //是，抛异常
        //判断isDelete是否为1
        //是，抛异常
        Integer rows=userMapper.updateAvatarByUid(uid,avatar,username,new Date());
        //调用持久层的updateAvatarByUid(),返回受影响行数
        if(rows!=1){
            throw new UpdateException("修改头像失败！发生未知错误");
        }
        //判断是否为1
    }

//    /**
//     * 添加收货地址
//     * @param address
//     * @return
//     */
//    @Override
//    public Address insertAddress(Address address) {
//
//
//        Integer rows=userMapper.insertAddress(address);
//        return null;
//    }


    /**
     * 执行密码加密，获取加密后的密码
     * @param salt 盐值
     * @param password 原始密码
     * @return 加密后的密码
     */
    private String getMd5Password(String salt,String password){
        /*
        加密规则：
            1.使用“盐+密码+盐”作为原文
            2.执行三重加密
         */
        System.out.println("原始密码"+password);
        System.out.println("盐值"+salt);
        for(int i=0;i<3;i++){
            password = DigestUtils.md5DigestAsHex((salt+password+salt).getBytes());
        }
        System.out.println("加密后"+password);
        return password;
    }







}
